iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
Software Development

奶茶裡藏的資料結構(Kotlin範例)系列 第 21

Stack 與 Queue:同一個容器,不同的規則

  • 分享至 

  • xImage
  •  

那麼換你了,給 Kotlin 的 ArrayDeque 增加 Queue 風格的操作吧。就用我剛剛寫的 Stack 風格改一改,很簡單的。」孩子眨眨眼。

我回想了一下,Queue 的操作名稱是 enqueue 和 dequeue,規則是先進先出。

改動比想像中還少,很快就寫出來了:

fun <E> ArrayDeque<E>.enqueue(element: E) = this.addFirst(element)

fun <E> ArrayDeque<E>.dequeue(): E {
    if (this.isEmpty()) throw NoSuchElementException("Queue is empty")
    return this.removeFirst()
}

fun <E> ArrayDeque<E>.peek(): E? = this.firstOrNull()

我只是把剛剛程式裡的 last 都換成了 first。

「嗯?就這樣?」因為太容易,反而讓我覺得不真實。

「可惜!差一點點。」小孩搖搖頭,「你這樣還是後進先出。enqueue 和 dequeue 不能同時都在同一端操作唷。」

我照著他說的地方修改了一下,總算對了:

fun <E> ArrayDeque<E>.enqueue(element: E) = this.addLast(element)

fun <E> ArrayDeque<E>.dequeue(): E {
    if (this.isEmpty()) throw NoSuchElementException("Queue is empty")
    return this.removeFirst()
}

fun <E> ArrayDeque<E>.peek(): E? = this.firstOrNull()

小孩點點頭,「這就對了。」

「為什麼操作名稱不和 Stack 統一,都用 push 和 pop 呢?」我忍不住問。

「就是怕你搞混啊。而且很多程式語言本來就不用這兩個詞。比如 Java 用的是 offer 和 poll,Python 用的是 append 和 popleft。」

「寫程式的人總希望不同語言之間能有共通的語法和關鍵字,但設計語言的人卻常想保留自己的特色。」

這番話讓我想起各種手機充電線的規格——也是花了很久才統一成 Type-C。


上一篇
兩邊討好的 ArrayDeque
系列文
奶茶裡藏的資料結構(Kotlin範例)21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言